package com.dw.service.impl;

import com.dw.dao.BaseDao;
import com.dw.service.BaseService;
import com.dw.util.MapToEntityTool;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @Description
 * @Author dw
 * @Date 2019/12/2 19:09
 * @Version 1.0
 **/
public abstract class BaseServiceImpl<T> implements BaseService<T> {

    /**
     *基础dao接口
     *
     * @param
     * @return com.dw.dao.BaseDao
     */
    public abstract BaseDao getBaseDao();

    /**
     * 传入T的类型
     **/
    public Class<?> clazz;
    public String tableName;
    public BaseServiceImpl() {
        Type type = this.getClass().getGenericSuperclass();
        ParameterizedType pt = (ParameterizedType)type;
        Type[] types = pt.getActualTypeArguments();
        clazz = (Class<?>) types[0];
        tableName = clazz.getSimpleName().toUpperCase();
    }
    /**
     * 插入表操作：数据库列名集合和属性值集合必须一一对应
     *
     * @param tableName 操作的表名称
     * @param columnList 数据库列名集合
     * @param propertyList 属性值集合
     * @return java.lang.Integer
     */
    @Override
    public Integer insert(String tableName, List<String> columnList, List<String> propertyList) {
        return getBaseDao().insert(tableName,columnList,propertyList);
    }

    /**
     * 根据id删除记录
     *
     * @param idMap id
     * @return java.lang.Integer
     */
    @Override
    public Integer delete(Map<String,String> idMap) {
        return getBaseDao().delete(tableName,idMap);
    }


    /**
     * 修改表记录
     *
     * @param tableName 操作的表名称
     * @param columnList 参数集合，列名
     * @param propertyList 参数集合，实体属性
     * @param idMap id
     * @return java.lang.Integer
     */
    @Override
    public Integer update(String tableName,List<String> columnList,List<String> propertyList,Map<String,String> idMap) {
        return getBaseDao().update(tableName,columnList,propertyList,idMap);
    }


    /**
     * 查询单条记录
     *
     * @param paramMap 条件集合 column:数据表类名 property：实体属性名称
     * @return T
     */
    @Override
    public T findByOne(String tableName,Map<String,String> paramMap) {
        Map<Object, Object> resultMap = getBaseDao().findByOne(tableName, paramMap);
        return (T)MapToEntityTool.mapToEntity(resultMap,clazz);
    }

    /**
     * 查询所有
     *
     * @param paramMap 参数集合
     * @return java.util.List<T>
     */
    @Override
    public List<T> findAll(String tableName,Map<String,String> paramMap) {

        List<Map<Object, Object>> resultList = getBaseDao().findAll(tableName,paramMap);
        List<T> list = new ArrayList<>();
        T t = null;
        for (Map<Object,Object> map : resultList) {
            t = (T)MapToEntityTool.mapToEntity(map,clazz);
            list.add(t);
        }
        return list;
    }

    /**
     * 查询总记录条数
     *
     * @param tableName
     * @return java.lang.Integer
     */
    @Override
    public Integer getTotalCount(String tableName) {
        return getBaseDao().getTotalCount(tableName);
    }


    /**
     * 分页查询
     *
     * @param tableName  操作的表名称
     * @param limit
     * @param offset
     * @return java.util.List<java.util.Map < java.lang.Object , java.lang.Object>>
     */
    @Override
    public List<Map<Object, Object>> getPageList(String tableName, Integer offset, Integer limit,Map<String, String> paramMap) {
        return getBaseDao().getPageList(tableName,offset,limit,paramMap);
    }
}
